function pair(x, y) {
  return [x, y];
}
function head(z) {
  return z[0];
}
function tail(z) {
  return z[1];
}

function list(...items) {
  return items.reverse().reduce((a, b) => pair(b, a), null);
}
function listRef(items, i) {}
function length(items) {
  if (isNull(items)) return 0;
  return 1 + length(tail(items));
}
function isNull(items) {
  return items === null;
}

function append(list1, list2) {
  if (isNull(list1)) return list2;
  return pair(head(list1), append(tail(list1), list2));
}

function lastPair(items) {
  if (isNull(tail(items))) return items;
  return lastPair(tail(items));
}
const m = list(1, 2, 3, 4);
// console.log(lastPair(m))
// function reverse(items) {
//     if (isNull(items)) return null;
//     return append(reverse(tail(items)), pair(head(items), null));
//   }
function reverse(items) {
  return reverseIter(items);
  function reverseIter(items, result = null) {
    if (isNull(items)) return result;
    // return append(reverseIter(tail(items)),pair(head(items),result))；
    return reverseIter(tail(items), pair(head(items), result));
  }
}
// console.log(JSON.stringify(reverse(m)))

function map(items, fn) {
  if (isNull(items)) return null;
  return pair(fn(head(items)), map(tail(items), fn));
}
// console.log(JSON.stringify(map(m,x=>x**2)))

module.exports = {
  pair,
  head,
  tail,
  list,
  isNull,
  reverse,
  map
};
